--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
libs/able/examples/multi_devices/main.py 1.9.5 (6c9e11e3) Text, 3.17 KB
T8b949e"""Scan for devices with name "KivyBLETest",
connect and periodically read connected devices RSSI.
Multiple `BluetoothDispatcher` objects are used:
one for the scanning process and one for every connected device.
"""
Tff7b72from T7ee787able Tff7b72import Te6edf3GATT_SUCCESSTb4b4b4, Te6edf3BluetoothDispatcher
Tff7b72from T7ee787ableT7ee787.T7ee787filters Tff7b72import Te6edf3DeviceNameFilter
Tff7b72from T7ee787kivyT7ee787.T7ee787app Tff7b72import Te6edf3App
Tff7b72from T7ee787kivyT7ee787.T7ee787clock Tff7b72import Te6edf3Clock
Tff7b72from T7ee787kivyT7ee787.T7ee787logger Tff7b72import Te6edf3Logger
Tff7b72from T7ee787kivyT7ee787.T7ee787uixT7ee787.T7ee787label Tff7b72import Te6edf3Label
Tff7b72class T56d364DeviceDispatcherTb4b4b4(Te6edf3BluetoothDispatcherTb4b4b4)Tb4b4b4:
T8b949e"""Dispatcher to control a single BLE device."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3deviceTb4b4b4: Ta5d6ff"Ta5d6ffBluetoothDeviceTa5d6ff"Tb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_device Tff7b72= Te6edf3device
Tff7b72selfTff7b72.Td2a8ff_addressTb4b4b4: Tffa657str Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetAddressTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_nameTb4b4b4: Tffa657str Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetNameTb4b4b4(Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Tf0883e@property
Tff7b72def Td2a8fftitleTb4b4b4(Tff7b72selfTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff<Tffd700{Tff7b72selfTff7b72.Td2a8ff_addressTffd700}Ta5d6ff><Tffd700{Tff7b72selfTff7b72.Td2a8ff_nameTffd700}Ta5d6ff>Ta5d6ff"
Tff7b72def Td2a8ffon_connection_state_changeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3statusTb4b4b4: Tffa657intTb4b4b4, Te6edf3stateTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3status Tff7b72== Te6edf3GATT_SUCCESS Tff7b72and Te6edf3stateTb4b4b4:
Te6edf3LoggerTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDevice: Tffd700{Tff7b72selfTff7b72.Td2a8fftitleTffd700}Ta5d6ff connectedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3LoggerTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDevice: Tffd700{Tff7b72selfTff7b72.Td2a8fftitleTffd700}Ta5d6ff disconnected. Tffd700{Te6edf3statusTffd700=}Ta5d6ff, Tffd700{Te6edf3stateTffd700=}Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffclose_gattTb4b4b4(Tb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_onceTb4b4b4(Te6edf3callbackTff7b72=Tff7b72lambda Te6edf3dtTb4b4b4: Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutTff7b72=T79c0ff15Tb4b4b4)
Tff7b72def Td2a8ffon_rssi_updatedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3rssiTb4b4b4: Tffa657intTb4b4b4, Te6edf3statusTb4b4b4: Tffa657intTb4b4b4)Tb4b4b4:
Te6edf3LoggerTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDevice: Tffd700{Tff7b72selfTff7b72.Td2a8fftitleTffd700}Ta5d6ff RSSI: Tffd700{Te6edf3rssiTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffperiodically_update_rssiTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""
Clock callback to read
the signal strength indicator for a connected device.
"""
Tff7b72if Tff7b72selfTff7b72.Td2a8ffgattTb4b4b4: T8b949e# if device is connected
Tff7b72selfTff7b72.Td2a8ffupdate_rssiTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffreconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3LoggerTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDevice: Tffd700{Tff7b72selfTff7b72.Td2a8fftitleTffd700}Ta5d6ff try to reconnect ...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconnect_gattTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_deviceTb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Start connection to device."""
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffgattTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnect_gattTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_deviceTb4b4b4)
Te6edf3ClockTff7b72.Td2a8ffschedule_intervalTb4b4b4(
Te6edf3callbackTff7b72=Tff7b72lambda Te6edf3dtTb4b4b4: Tff7b72selfTff7b72.Td2a8ffperiodically_update_rssiTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutTff7b72=T79c0ff5
Tb4b4b4)
Tff7b72class T56d364ScannerDispatcherTb4b4b4(Te6edf3BluetoothDispatcherTb4b4b4)Tb4b4b4:
T8b949e"""Dispatcher to control the scanning process."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
T8b949e# Stores connected devices addresses
Tff7b72selfTff7b72.Td2a8ff_devicesTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3DeviceDispatcherTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72def Td2a8ffon_scan_startedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3successTb4b4b4: Tffa657boolTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3successTb4b4b4:
Te6edf3LoggerTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6ff"Ta5d6ffScan: startedTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3LoggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffScan: error on startTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffon_scan_completedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3LoggerTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6ff"Ta5d6ffScan: completedTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffon_deviceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3deviceTb4b4b4, Te6edf3rssiTb4b4b4, Te6edf3advertisementTb4b4b4)Tb4b4b4:
Te6edf3address Tff7b72= Te6edf3deviceTff7b72.Td2a8ffgetAddressTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3address Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ff_devicesTb4b4b4:
T8b949e# Create dispatcher instance for a new device
Te6edf3dispatcher Tff7b72= Te6edf3DeviceDispatcherTb4b4b4(Te6edf3deviceTb4b4b4)
T8b949e# Remember address,
T8b949e# to avoid multiple dispatchers creation for this device
Tff7b72selfTff7b72.Td2a8ff_devicesTb4b4b4[Te6edf3addressTb4b4b4] Tff7b72= Te6edf3dispatcher
Te6edf3LoggerTff7b72.Td2a8ffinfoTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffScan: device <Tffd700{Te6edf3addressTffd700}Ta5d6ff> addedTa5d6ff"Tb4b4b4)
Te6edf3dispatcherTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72class T56d364MultiDevicesAppTb4b4b4(Te6edf3AppTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffbuildTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3ScannerDispatcherTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstart_scanTb4b4b4(Te6edf3filtersTff7b72=Tb4b4b4[Te6edf3DeviceNameFilterTb4b4b4(Ta5d6ff"Ta5d6ffKivyBLETestTa5d6ff"Tb4b4b4)Tb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3LabelTb4b4b4(Te6edf3textTff7b72=Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4)
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3MultiDevicesAppTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────